﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Media;
using System.Collections.ObjectModel;
using System.Data;
using System.Windows.Media.Imaging;
using System.ComponentModel;
using System.Diagnostics;
using System.Windows.Controls;
using System.Globalization;
using produccion.modelo;
using produccion.AccesoDatos;
using produccion.clases;
using produccion.modulos;
using System.Windows.Input;
using System.Collections.Specialized;
using System.Drawing.Printing;


namespace produccion.vistamodelo
{
    class VMConsultaFacturas : ViewModelBase, IDataErrorInfo
    {
        #region Campos
            private CLSMAECLIP _cli = new CLSMAECLIP();
            private MDOgeneral _mod = new MDOgeneral();
            private MConsultaFacturas.Encabezado _enc = new MConsultaFacturas.Encabezado();
            private MConsultaFacturas.Detalle _det = new MConsultaFacturas.Detalle();
        #endregion

        #region constructor
            public VMConsultaFacturas()
            {
                try
                {
                    if (MDOgeneral.conexion == null || MDOgeneral.conexion.State == ConnectionState.Closed)
                    {
                        MDOgeneral.conectar();
                    }
                    strTituloVentana = "Consulta de Facturas - Usuario: " + MDOgeneral.usuario + " - [FRMConsultaFacturas]";
                    lisclientes = _cli.listaClienteFacturas();
                }
                catch (Exception ex) { MessageBox.Show(ex.Message); }
            }
        #endregion

        #region Comandos
            
            RelayCommand _cmdImprimir;
            public ICommand cmdImprimir
            {
                get
                {
                    if (_cmdImprimir == null)
                    {
                        _cmdImprimir = new RelayCommand(x => imprimirFactura());
                    }
                    return _cmdImprimir;
                }
            }

            RelayCommand _cmdDobleClic;
            public ICommand cmdDobleClic
            {
                get
                {
                    if (_cmdDobleClic == null)
                    {
                        _cmdDobleClic = new RelayCommand(r => dobleClic());
                    }
                    return _cmdDobleClic;
                }
            }

            RelayCommand _cmdProcesar;
            public ICommand cmdProcesar
            {
                get
                {
                    if (_cmdProcesar == null)
                    {
                        _cmdProcesar = new RelayCommand(r => consultarFacturas());
                    }
                    return _cmdProcesar;
                }
            }

            RelayCommand _cmdLimpiar;
            public ICommand cmdLimpiar
            {
                get
                {
                    if (_cmdLimpiar == null)
                    {
                        _cmdLimpiar = new RelayCommand(r => limpiar());
                    }
                    return _cmdLimpiar;
                }
            }

            RelayCommand _cmdSalir;
            public ICommand cmdSalir
            {
                get
                {
                    if (_cmdSalir == null)
                    {
                        _cmdSalir = new RelayCommand(Salir);
                    }
                    return _cmdSalir;
                }
            }
        #endregion

        #region Propiedades
            private string _strTituloVentana;
            public string strTituloVentana
            {
                get { return _strTituloVentana; }
                set { _strTituloVentana = value; base.OnPropertyChanged("strTituloVentana"); }
            }

            private List<CLSMAECLIP> _lisclientes = new List<CLSMAECLIP>();
            public List<CLSMAECLIP> lisclientes
            {
                get { return _lisclientes; }
                set { _lisclientes = value; base.OnPropertyChanged("lisclientes"); }
            }

            private CLSMAECLIP _selcliente = new CLSMAECLIP();
            public CLSMAECLIP selcliente
            {
                get { return _selcliente; }
                set { _selcliente = value; base.OnPropertyChanged("selcliente"); }
            }

            private DateTime _dtmFechaDesde = Convert.ToDateTime("01/01/" + DateTime.Now.Year.ToString()).Date;
            public DateTime dtmFechaDesde
            {
                get { return _dtmFechaDesde; }
                set { _dtmFechaDesde = value; base.OnPropertyChanged("dtmFechaDesde"); }
            }

            private DateTime _dtmFechaHasta = DateTime.Now.Date;
            public DateTime dtmFechaHasta
            {
                get { return _dtmFechaHasta; }
                set { _dtmFechaHasta = value; base.OnPropertyChanged("dtmFechaHasta"); }
            }

            private string _strFactura;
            public string strFactura
            {
                get { return _strFactura; }
                set { _strFactura = value; base.OnPropertyChanged("strFactura"); }
            }

            private ObservableCollection<VMEncabezadoFac> _lisfacturas = new ObservableCollection<VMEncabezadoFac>();
            public ObservableCollection<VMEncabezadoFac> lisfacturas
            {
                get { return _lisfacturas; }
                set { _lisfacturas = value; base.OnPropertyChanged("lisfacturas"); }
            }

            private VMEncabezadoFac _selfactura;
            public VMEncabezadoFac selfactura
            {
                get { return _selfactura; }
                set {  _selfactura = value; base.OnPropertyChanged("selfactura");  }
            }

            private List<MConsultaFacturas.Detalle> _lisdetalle = new List<MConsultaFacturas.Detalle>();
            public List<MConsultaFacturas.Detalle> lisdetalle
            {
                get { return _lisdetalle; }
                set { _lisdetalle = value; base.OnPropertyChanged("lisdetalle"); }
            }

            private MConsultaFacturas.Detalle _seldetalle = new MConsultaFacturas.Detalle();
            public MConsultaFacturas.Detalle seldetalle
            {
                get { return _seldetalle; }
                set { _seldetalle = value; base.OnPropertyChanged("seldetalle"); }
            }

 
        #endregion

        #region Metodos

            void consultarFacturas()
            {
                try
                {
                    Mouse.OverrideCursor = Cursors.Wait;

                    List<MConsultaFacturas.Encabezado> listado = new List<MConsultaFacturas.Encabezado>();

                    string strCodCli = "";
                    if (selcliente == null)
                    {
                        strCodCli = "";
                    }
                    else
                    {
                        if (selcliente.CODCLI_CLI == null)
                            strCodCli = "";
                        else
                            strCodCli = selcliente.CODCLI_CLI;
                    }

                    listado = _enc.consultar(strCodCli, dtmFechaDesde, dtmFechaHasta, strFactura);

                    List<VMEncabezadoFac> all = (from lis in listado select new VMEncabezadoFac(lis)).ToList();
                    foreach (VMEncabezadoFac xx in all)
                    {
                        xx.logSeleccionado = false;
                    }
                    lisfacturas.Clear();
                    lisfacturas = new ObservableCollection<VMEncabezadoFac>(all);

                    Mouse.OverrideCursor = Cursors.Arrow;
                }
                catch (Exception ex) { MessageBox.Show(ex.Message); }
            }

            void dobleClic()
            {
                try
                {
                    if (selfactura != null)
                    {
                        desmarcar(selfactura.strFactura);
                        strFactura = selfactura.strFactura;
                        consultarDetalle();
                    }
                }
                catch (Exception ex) { MessageBox.Show(ex.Message); }
            }

            void consultarDetalle()
            {
                try
                {
                    Mouse.OverrideCursor = Cursors.Wait;

                    lisdetalle = _det.consultar(strFactura);

                    Mouse.OverrideCursor = Cursors.Arrow;
                }
                catch (Exception ex) { MessageBox.Show(ex.Message); }
            }

            void desmarcar(string strNumero)
            {
                try
                {
                    foreach (VMEncabezadoFac lis in lisfacturas)
                    {
                        if (lis.strFactura == strNumero)
                            lis.logSeleccionado = true;
                        else
                            lis.logSeleccionado = false;
                    }
                }
                catch (Exception ex) { MessageBox.Show(ex.Message); }
            }

            public void imprimirFactura()
            {
                try
                {
                    Mouse.OverrideCursor = Cursors.Wait;

                    MDOgeneral mod = new MDOgeneral();

                    if (strFactura != null)
                    {
                        // Se captura la impresora por defecto
                        string strImpresora = "";
                        foreach (string strPrinter in PrinterSettings.InstalledPrinters)
                        {
                            PrinterSettings a = new PrinterSettings();
                            a.PrinterName = strPrinter.ToString();
                            if (a.IsDefaultPrinter)
                            {
                                strImpresora = a.PrinterName;
                            }
                        }

                        // Se imprime la factura

                        //Para saber si lo imprime por facturacion normal o facturacion varios
                        string query = "select count(*) as Total from (select distinct a.codtal_pro,a.codref_pro,a.codcol_pro, c.nroord_eod from maepro a inner join detordd b on a.codref_pro=b.codref_dod and a.codcol_pro=b.codcol_dod inner join encordd c on b.nroord_dod=c.nroord_eod where c.nrodes_eod='" + strFactura.Trim() + "' order by a.codtal_pro) a left join detordd b on a.codref_pro=b.codref_dod and a.codcol_pro=b.codcol_dod and a.codtal_pro=b.codtal_dod and b.nroord_dod=a.nroord_eod ";
                        DataTable val = mod.consulta(query);


                        //
                        
                        //
                        if (Convert.ToInt32(val.Rows[0][0]) > 0)
                        {
                            var imp = new ImprimirFactura();
                            string strMensaje = "";
                            imp.ImprimirDatos(strFactura, strImpresora, out strMensaje, 1, false, false);
                        }
                        else
                        {
                            string query1 = "select empresa_efa, tipfac_efa from encfacp where nrofac_efa = '" + strFactura.Trim() + "'";
                            DataTable dtf = mod.consulta(query1);

                            string strTipDocu = dtf.Rows[0][1].ToString() == "FA" ? "FACTURA DE VENTA" : dtf.Rows[0][1].ToString() == "NC" ? "  NOTA CREDITO  " : "   NOTA DEBITO  ";
                            
                            var imp = new ImprimirFacturaVarios();
                            string strMensaje = "";
                            imp.ImprimirDatos(strFactura, dtf.Rows[0][0].ToString(), strImpresora, out strMensaje, 1, strTipDocu, false, false);
                        }
                    }
                    else
                    {
                        MessageBox.Show("Falta ingresar el numero de factura o seleccionar una factura del listado de facturas.", "Inconsistencia", MessageBoxButton.OK, MessageBoxImage.Error, MessageBoxResult.OK);
                    }

                    Mouse.OverrideCursor = Cursors.Arrow;
                }
                catch (Exception ex) { MessageBox.Show(ex.Message); }
            }

            private void limpiar()
            {
                try
                {
                    selcliente = null;
                    lisfacturas.Clear();
                    lisdetalle.Clear();
                    strFactura = null;
                    dtmFechaDesde = Convert.ToDateTime("01/01/" + DateTime.Now.Year.ToString()).Date;
                    dtmFechaHasta = DateTime.Now.Date;
                }
                catch (Exception ex) { MessageBox.Show(ex.Message); }
            }
    
            public void Salir(object frmFormulario)
            {
                try
                {
                    ((Window)frmFormulario).Close();
                }
                catch (Exception ex) { MessageBox.Show(ex.Message); }
            }

        #endregion

        #region IDataErrorInfo Members

        string IDataErrorInfo.Error { get { return null; } }

        string IDataErrorInfo.this[string propertyName]
        {
            get { return this.GetValidationError(propertyName); }
        }

        #endregion

        #region Validation

            /// <summary>
            /// Returns true if this object has no validation errors.
            /// </summary>
            /// 

            public bool IsValid
            {
                get
                {
                    foreach (string property in ValidatedProperties)
                        if (GetValidationError(property) != null)
                            return false;

                    return true;
                }
            }

            static readonly string[] ValidatedProperties = 
            { 
                "strFactura",
                "selcliente"
            };

            string GetValidationError(string propertyName)
            {
                if (Array.IndexOf(ValidatedProperties, propertyName) < 0)
                    return null;

                string error = null;

                switch (propertyName)
                {
                    case "strFactura":
                        error = this.ValidateFactura();
                        break;
                    case "selcliente":
                        error = this.ValidateCliente();
                        break;
                    default:
                        Debug.Fail("Unexpected property being validated on Customer: " + propertyName);
                        break;
                }
                return error;
            }

            string ValidateFactura()
            {
                try
                {
                    if (strFactura != null)
                    {
                        if (strFactura.Length == 0)
                            return null;
                        else
                        {
                            if (strFactura.Length < 7)
                                return "Debe ingresar un numero de factura valido.";
                        }
                    }

                    return null;
                }
                catch (Exception ex) { MessageBox.Show(ex.Message); }
                return null;
            }

            string ValidateCliente()
            {
                try
                {
                    //if (selcliente != null)
                    //{
                    //    if (selcliente.CODCLI_CLI == null)
                    //    {
                    //        if (strFactura == null)
                    //            return "Falta seleccionar un cliente.";
                    //    }
                    //}
                    return null;
                }
                catch (Exception ex) { MessageBox.Show(ex.Message); }
                return null;
            }

        #endregion
    }

    #region Vista-modelo
    public class VMEncabezadoFac : ViewModelBase, IDataErrorInfo
    {

        #region Campos
        private MConsultaFacturas.Encabezado _encfac = new MConsultaFacturas.Encabezado();
        #endregion

        #region Constructor

        public VMEncabezadoFac(MConsultaFacturas.Encabezado encfac)
        {
            _encfac = encfac;
        }

        #endregion

        #region Propiedades

        public string strFactura
        {
            get { return _encfac.strFactura; }
            set { _encfac.strFactura = value; base.OnPropertyChanged("strFactura"); }
        }

        public string strCliente
        {
            get { return _encfac.strCliente; }
            set { _encfac.strCliente = value; base.OnPropertyChanged("strCliente"); }
        }

        public DateTime dtmFecha
        {
            get { return _encfac.dtmFecha; }
            set { _encfac.dtmFecha = value; base.OnPropertyChanged("dtmFecha"); }
        }

        public DateTime dtmFechaVencimiento
        {
            get { return _encfac.dtmFechaVencimiento; }
            set { _encfac.dtmFechaVencimiento = value; base.OnPropertyChanged("dtmFechaVencimiento"); }
        }

        public double numValor
        {
            get { return _encfac.numValor; }
            set { _encfac.numValor = value; base.OnPropertyChanged("numValor"); }
        }

        public Int32 numIva
        {
            get { return _encfac.numIva; }
            set { _encfac.numIva = value; base.OnPropertyChanged("numIva"); }
        }

        public Int32 numRetencion
        {
            get { return _encfac.numRetencion; }
            set { _encfac.numRetencion = value; base.OnPropertyChanged("numRetencion"); }
        }

        public double numDescuento
        {
            get { return _encfac.numDescuento; }
            set { _encfac.numDescuento = value; base.OnPropertyChanged("numDescuento"); }
        }

        public double numAbono
        {
            get { return _encfac.numAbono; }
            set { _encfac.numAbono = value; base.OnPropertyChanged("numAbono"); }
        }

        public string strConcepto
        {
            get { return _encfac.strConcepto; }
            set { _encfac.strConcepto = value; base.OnPropertyChanged("strConcepto"); }
        }

        public string strEstado
        {
            get { return _encfac.strEstado; }
            set { _encfac.strEstado = value; base.OnPropertyChanged("strEstado"); }
        }

        public double numFlete
        {
            get { return _encfac.numFlete; }
            set { _encfac.numFlete = value; base.OnPropertyChanged("numFlete"); }
        }

        public string strTipo
        {
            get { return _encfac.strTipo; }
            set { _encfac.strTipo = value; base.OnPropertyChanged("strTipo"); }
        }

        public string strEmpresa
        {
            get { return _encfac.strEmpresa; }
            set { _encfac.strEmpresa = value; base.OnPropertyChanged("strEmpresa"); }
        }

        public string strDetalle
        {
            get { return _encfac.strDetalle; }
            set { _encfac.strDetalle = value; base.OnPropertyChanged("strDetalle"); }
        }

        public Boolean logSeleccionado
        {
            get { return _encfac.logSeleccionado; }
            set { _encfac.logSeleccionado = value; base.OnPropertyChanged("logSeleccionado"); }
        }

        #endregion

        #region Metodos

        public MConsultaFacturas.Encabezado getFacturas()
        {
            return _encfac;
        }

        #endregion

        #region IDataErrorInfo Members

        string IDataErrorInfo.Error { get { return null; } }

        string IDataErrorInfo.this[string propertyName]
        {
            get { return this.GetValidationError(propertyName); }
        }

        #endregion

        #region Validation

        /// <summary>
        /// Returns true if this object has no validation errors.
        /// </summary>
        /// 

        public bool IsValid
        {
            get
            {
                foreach (string property in ValidatedProperties)
                    if (GetValidationError(property) != null)
                        return false;

                return true;
            }
        }

        static readonly string[] ValidatedProperties = 
                    { 
                        "logSeleccionado"
                    };

        string GetValidationError(string propertyName)
        {
            string error = null;

            if (Array.IndexOf(ValidatedProperties, propertyName) < 0)
                return null;

            //&& CODCPT_NVP.Length==3
            switch (propertyName)
            {
                case "logSeleccionado":
                    error = this.ValidateSeleccionado();
                    break;
                default:
                    Debug.Fail("Unexpected property being validated on Customer: " + propertyName);
                    break;
            }
            return error;
        }

        string ValidateSeleccionado()
        {
            try
            {
                if (logSeleccionado == false)
                {
                    return null;
                }
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
            return null;
        }


        #endregion

    }
    #endregion
}
